انواع پروژه ها برنامه نویسی

Dynamic Data Exchange پروتکلی است که انتقال داده بین برنامه های کاربردی تحت ویندوز را ممکن میسازد . با استفاده از این ارتباط میتونید اطلاعات مورد نظر خود را از سایر برنامه ها بدست آورید یا به آنها ارسال کنید ... البته این ارتباط باید از طرف برنامه ای که میخواهید ارتباط DDE رو با اون برقرار کنید مورد تایید باشه و اون برنامه هم با استفاده از روشهایی که در ادامه متوجه خواهید شد این اجازه رو به برنامه های دیگه بده که از اطلاعات اون استفاده کنند .

مثلا" Explorer ویندوز یا برنامه Excel یه همچین امکانی رو به برنامه نویسان میدن یا برنامه های دیگه ویندوز … علاوه بر این شما هم میتونید به برنامه های دیگه این جازه رو بدید که از اطلاعات برنامه شما استفاده کنن ... این که میگم اطلاعات منظورم فقط تصویر به صورت عکس و Text هست . چون فقط کنترلهای Label و Textbox و PictureBox از متدها و خواص مربوط به DDE پشتیبانی میکنند . 
نکته ای که باید توجه کنید اینه که همیشه اول باید برنامه منبع ( Source ) اجرا شده باشه تا برنامه مقصد ( Distinition ) 

بتونه با روشهایی که اعلام میکنم ارتباط DDE رو برقرار کنه ..در غیر این صورت برنامه با خطا مواجه میشود .خوب فکر کنم قبل از اینکه متد ها و رویدادها و خواص مختلف مربوط به این ارتباط رو بررسی کنیم بهتر باشه یه مثال رو که ایجاد یک ارتباط ساده رو نشون میده با هم انجام بدیم بعد یکی یکی موارد رو بررسی کنیم .

ابتدا یک پروژه جدید تعریف کنید .... اول میخواهیم فرم و برنامه Server برنامه منبع رو طراحی کنیم 
فقط کافیه روی فرم یک textbox مثلا" با نام intxt قرار بدهید ... بعد نام پروژه و نام فیل اجرایی که ساخته میشه رو به مثلا invblog تغییر بدید حالا فقط یک کار مونده که برای برنامه Server انجام بدید .... اون اینکه از قسمت خواص فرم در حالت design خاصیت LinkMode فرم رو به 1-Source تغییر بدهید 

نکته : بهتره نام های کنترلها رو همینی که من تعیین کردم بگذارید چون بعدا در طراحی برنامه مقصد به این اسمها نیاز دارید و اینجوری اسمها رو اشتباه نمیکنید . چون کوچیکترین اشتباه برنامه رو در همون مرحله اول متوقف میکنه و اصلا" ارتباطی برقرار نمیشه .

حالا با هم برنامه مقصد یا Client رو طراحی می کنیم . 
اینبار برای برنامه Client تعیین نام پروژه و فایل اجرایی مهم نیست . فقط کافیه که یک textbox روی فرم قرار بدهید و خاصیت LinkTopic عنصر textbox رو به invblog|Form1 تغییر بدهید ... invblog بر اساس نام پروژه یا نام فایل اجرایی است که textbox برنامه مقصد قرار است از آن فرمان بگیرد تعیین میشود و Form1 بر اساس مقدار تعیین شده در خاصیت LinkTopic فرم برنامه منبع ( Server ) تعیین میشود مقدار پیش فرض این خاصیت نام اولیه و پیش فرض فرم برنامه Server است که اگر این مقدار رو در برنامه اول تغییر دادید باید بجای پارامتر دوم خاصیت LinkTopic عنصر textbox در برنامه دوم (Client) قرار دهید.

لازم به تذکر است که این دو پارامتر با علامت | بدون فاصله از هم جدا میشوند

در آخر خاصیت LinkItem عنصر textbox رو با نام textbox برنامه Server که در اینجا intxt است مقدار دهی میکنیم و فقط یک خط Text1.LinkMode = 1 رو برای فرم لود برنامه مینویسیم .

توجه داشته باشید که موقع اجرا حتما" باید اول برنامه Server رو اجرا کنید بعد برنامه Client رو اجرا کنید وگرنه اجرا با مشکل مواجه میشه
حالا با احرای دو تا برنامه میبینید که هرچی تو textbox برنامه invblog تایپ میکنید تو textbox برنامه دوم هم تایپ میشهفقط اگه برنامه رو از روی فایل اجرایی اجرا میکنید نام فایل برنامه Server رو باید حتما ( در این مثال ) invblog قرار بدید وگرنه ارتباطی در کار نخواهد بود . 

تو این مثال برای فایل منبع که اصلا کد نویسی نداشتیم و برای فایل مقصد هم که فقط یک خط Text1.LinkMode = 1 رو نوشتیم .... ولی تمامی این خواص که در حالت طراحی فرم تقییر دادیم مثل LinkTopic و .... از طریق کد نویسی هم میتونید انجام بدید .
خوب و اما بررسی دقیقتر خواص و متدهای لازم برای این کار همون طور که در مثال دیدید اولین کاری که باید بکنیم اینه که خاصیت Linkmode فرم برنامه منبع رو 1 قرار بدهیم .کار بعدی که باید انجام بدیم اینه که یه نام مشخص برای برای خاصیت LinkTopic فرم برنامه منبع تعیین کنیم اسم کنترلی که میخوایم با اون ارتباط برقرار کنیم رو هم در خاطر داشته باشیم که بعدا در برنامه مقصد لازمش داریم در مرحله آخر هم پروژه و فایل اجرایی برنامه رو با نام مشخصی ذخیره کنیم و اون نام رو هم به یاد داشته باشیم . 

حالا برنامه منبع ما آماده هست باید برنامه دوم ( مقصد ) رو طراحی کنیم :
برای یک ارتباط ساده و اولیه سه تا از خصوصیات کنترلی که میخواهید ارتباط را با آن ایجاد کنید در برنامه مقصد تنضیم میکنید 
این سه خصوصیت LinkTopic و LinkItem و Linkmode میباشد و به صورت زیر تعریف میشود .
نام کنترل . LinkTopic = “نام فایل اجرایی برنامه | مشخص شده در فرم برنامه منبع Linktopic "
در اینجا اگر برنامه رو در محیط vb اجرا میکنید و نه از طریق فایل اجرایی" نام فایل اجرایی برنامه " باید به نام فایل پروژه تغییر کند...
نام کنترل . LinkItem = " نام کنترلی ( در برنامه منبع ) که ارتباط باید با آن برقرار شود "

توجه کنید که کنترل میتواند Label و Textbox و PictureBox باشد اگر کنترل PictureBox باشد عکس آن انتقال داده میشود و در غیر این صورت متن منتقل میشود .
بعد از تعیین LinkTopic و LinkItem باید Linkmode تعیین شود .
1 یا 2 یا 3 . LinkeMode = نام کنترل 
اگر این مقدار 1 باشد ارتباط و انتقال اطلاعات به صورت اتوماتیک میباشد . یعنی به طور مداوم با تغییر محتویات کنترل تعیین شده اطلاعات آن به کنترل لازمه انتقال داده میشود . یک نمونه از این نوع ارتباط را در مثال اول ملاحضه کردید .
اما اگر مقدار LinkeMode برابر 2 تعیین شده باشد انتقال اطلاعات به طور دستی صورت میگیرد … یعنی ارتباط در این حالت در صورت درست بودن برقرار میشود ولی اطلاعاتی بطور اتوماتیک منتقل نمیشود . در این حالت اطلاعات میتواند با فراخوانی متد LinkRequest منتقل شود .
نام کنترل . LinkRequest 
اما حالت سوم LinkeMode با مقدار 3 میباشد .... این حالت هم مانند ارتباط قبلی غیر اتوماتیک میباشد که انتقال اطلاعات 
باید از طریق LinkRequest صورت گیرد ... فقط در این حالت میتوان از رویداد Linknotify استفاده کرد 

رویدادهای DDE

رویداد LinkNotify
این رویداد وقتی فراخوانی میشود که محتویات کنترل تعیین شده در LinkItem تغییر کرده باشد .یادآوری میشود که برای استفاده از این رویداد باید LinkeMode با مقدار 3 تعیین شده باشد . در واقع این رویداد تغییر محتویات کنترل مورد نظر در برنامه منبع را به برنامه مقصد اعلام میکند !

رویداد LinkClose : این رویداد وقتی فراخوانی میشود که ارتباط وصل شده DDE به هر دلیلی قطع شود ." مثلا یکی از برنامه های منبع یا مقصد بسته شود "

رویداد LinkError
اگر در طی ارتباط DDE Conversation خطایی رخ دهد این رویداد فراخوانی میگردد و شماره خطا به عنوان پارامتر و آرگومان این رویداد ارسال میشود .

رویداد LinkOpen
وقتی که ارتباط DDE مقدار دهی شود و ارتباط برقرار شود این رویداد فراخوانی میشود .

خاصیت LinkTimeOut
مدت زمانی که طول میکشه تا اطلاعات از یک برنامه به یک برنامه دیگه منتقل بشه در کامپیوتر های مختلف متفاوت میباشد 
این زمان به حجم داده اطلاعاتی و سرعت کامپیوتر و حافظه آزاد کامپوتر و .... بستگی داره اگر برنامه ای در مدت معین شده در این خاصیت اطلاعات خود را نتواند انتقال دهد برنامه با خطا مواجه میشود . 
مقدار پیشفرض این خاصیت 50 است که بع اندازه تقریبا" 5 ثانیه میباشد و مقدار مناسبی برای این خاصیت میباشد

متد LinkPoke:
این متد عکس عمل LinkRequest میباشد و انتقال اطلاعات از کنترل برنامه مقصد به کنترل برنامه منبع را انجام میدهد . 
با استفاده از این دستور میتوانید مثلا" متنی را به برنامه دیگر بفرستید و نتیجه را در TextBox برنامه منبع مشاهدا کنید .

متد LinkSend 
این دستور اطلاعات کنترل PictureBox را به برنامه مقصد میفرستد ... این دستور همان کار 
LinkRequest را انجام میدهد با این تفاوت که در LinkRequest درخواست انتقال اطلاعات از کنترل منبع به مقصد از طرف برنامه مقصد صورت میگیرد ولی در LinkSend درخواست انتقال اطلاعات باز هم از کنترل منبع به مقصد از طرف برنامه منبع صورت میگیرد

متد LinkExecute
این دستور رشته ای را از یک برنامه ( منبع یا مقصد ) به برنامه دیگر میفرستد .... اما چگونه این رشته رو در برنامه دیگر دریافت کنیم ؟ با استفاده ار رویداد LinkExecute در برنامه دیگر 
این دستور یک پارامتر ورودی از نوع String دارد که رشته مورد نظر را تعیین میکند

رویداد LinkExecute
این رویداد به محض ارسال رشته ای از برنامه دیگر در ارتباط DDE اتفاق میافتد و این رویداد دو پارامتر دارد که اولی رشته فرستاده شده و دومی Cancel میباشد که نشان میدهد آیا برنامه رشته را پذیرفته و دریافت میکند یا نه یه مثال میزنم فرض کنید برنامه مقصد به وسیله کد زیر دستوری را به برنامه دیگه میفرسته 

Private Sub Command2_Click()
Text1.LinkExecute "www.vblog.blogfa.com"
End Sub

و در برنامه منبع هم کد زیر رو داریم : 
Private Sub Form_LinkExecute(CmdStr As String, Cancel As Integer)
Me.Caption = CmdStr
Cancel = False
End Sub

همینطور که میبینید CmdStr رشته ای را در Caption فرم نمایش میدهد که با LinkExecute فرستاده شده بود 
در اینجا اگر پارامتر Cancel رو بعد از اینکه مقدار فرستاده شده را دریافت کردیم False نکنیم با خطا 285 مواجه میشویم ...

مشخصه Causes Validation

شايد زمانی که داشتيد روی مشخصات (Properties) مربوط به Text Box نظر می کرديد، مشخصه causes Validation را نيز ديده باشيد که ما در بخش قبل از آن نام نبرديم. اين مشخصه در بسياری از VCLها نيز وجود دارد و دارای کاربرد بسيار زيبايی است که شايد اگر وجود نداشت، برای شبيه سازی آن بوسيله کدنويسی، زمان زيادی را صرف خود می کرد.

فرض کنيد بر روی فرم يک Text Box به نام txtNumber وجود دارد که برای دريافت نمره يک درس دانش آموزی از کاربر، استفاده می شود. ترجيح می دهيم کاربر نتواند اين فرم را save کند (نتواند به سراغ کليد cmdSave برود) مگر اينکه نمره صحيح (که در فاصله صفر تا بيست است،) را وارد نموده باشد. اما مثلاً بتواند روی دکمه cmdCancel برود و فرم را Cancel نمايدو يعنی می خواهيم اگر نمره در دامنه صحيح خود نبود روی برخی ديگر از آنها نرود.
اگر برای رويداد(Event) Validate از txtNumber ، چنين داشته باشيم:

Private Sub txtNumber_Validate (Cancel As Boolean)
IF Val (txtNumber) > 20 then
Cancel = True
End IF
End Sub

Event Procedure فوق می گويد هر وقت که txtNumber ، Validate شد، بررسی کن که آيا نمره کمتر از 20 هست يا خير که اگر نبود، پارامتر Cancel را True نمايد. حال اگر مشخصه Causes Validation از هر کنترلی را True نماييم، در صورتی که Val(txtNumber)>20 باشد، کاربر نمی تواند، آن کنترل را فوکوس دهد. لذا اگر مشخصه مذکور را برای کليد cmd Save برابر True و برای cmdCancel برابر False تغير دهيم، درصورت نبودن نمره در فاصله مناسب، کاربر می تواند عمليات دکمه Cancel را انجام دهد اما عمليات دکمه Save را خير مگر اينکه دوباره Text Box مذکور را با عددی مناسب Validate نمايد.
توجه کنيد که می توانيد برای زيبايی برنامه مذکور برای رويداد Key up از txtNumber نيز چنين داشته باشيم.

Private Sub txtNumber_KeyUp (KeyCode As Integer, shift As Integer)
IF Value (txtNumber)>20 then
txtNumber. Forecolore = VBRed
Else
txtNumber. Forecolore = VBBlack
Evd IF
End Sub

که برای نمايش اينکه با وارد نودن نمره ای به کاربر خطايی رخ داده است، رنگ متن آن را به رنگ قرمز (Red) در می آوريم و در غير اينصورت (يعنی بدون خطا) رنگ متن را به رنگ سياه (Black) در خواهيم آورد.

ذکر چند مشخصه ديگر: 
1- اگر برای يک کليد (Command Button)، مشخصه Cancel را به True قرار دهيم، در صورت زدن کليد (Escape) ESC توسط کاربر، رويداد Click از اين کليد روی می دهد.
2- اگر برای يک کليد، مشخصه Default را به True تغيير دهيم، در صورت زدن کليد Enter توسط کاربر، رويداد Click از آن روی خواهد داد.
3- اگر برای يک فرم، رويداد Key Preview را به True تغيير دهيم، هر کليدی را کاربر از صفحه کليد فشار دهد، ابتدا اين کليد به رويداد KeyPress از فرم فرستاده می شود و آنگاه به رويداد Key Press از کنترلی که Focus در اختيار آن است، فرستاده می شود

*********************************
نکاتی در باره توابع ، متغيرها و نحوه استفاده آنها

ارسال متغير بصورت ByRef و ByVal

اگر موقع تعريف يک تابع قبل از نام متغير از عبارت ByRef استفاده نماييم هنگام فراخوانی تابع با قراردادن متغيری در تابع که دارای مقدارميباشد ، پس از محاسبات ، مقدار متغير نيز تغيير ميکند. در ضمن مقدار تابع با آخرين مقدار متغير محاسبه ميگردد:

Function Use_ByRef(ByRef intVar As Integer)
intVar = intVar + 1
Return intVar
End Function

Dim intMyVar As Integer
intMyVar = 1
Response.Write(intMyVar & "-----" & Use_ByRef(intMyVar))

پاسخ : 2-----3

ولی اگر در مثال فوق ازByVal استفاده کنيم ، پس از محاسبات مقدار متغير تغيير نميکند و نيز مقدار تابع با مقدار اوليه متغير محاسبه ميشود:

Function Use_ByVal(ByVal intVar As Integer)
intVar = intVar + 1
Return intVar
End Function

Dim intMyVar As Integer
intMyVar = 1
Response.Write(intMyVar & "-----" & Use_ByVal(intMyVar))

پاسخ : 1-----2 

متغير Static

اگر درون تابعی متغيری را بصورت Static تعريف نماييم و مقدار اين متغير طي عمليات تابع تغيير نمايد در هرفراخوانی متغير ياد شده با آخرين مقدارخود در محاسبات شرکت ميکند.

اين مورد بر خلاف تعريف متغيير بوسيله دستور Dim است . چون در Dim متغيير بمحض تعريف شدن دوباره ، مقدار قبلي خود را از دست ميدهد.

Function Use_Static()
Static intCount As Integer
intCount = intCount+1
Return intCount
End Function

Response.Write( "
" & Use_Static)
Response.Write( "
" & Use_Static)
Response.Write( "
" & Use_Static) 

1 پاسخ :
2
3

تعريف توابع بصورت OverLoads

در نظر بگيريد كه در جايي از برنامه خود احتياج داشته باشيد كه يك فانكشن را فراخواني و پارامترهاي ورودي آنرا كه استرينك است به آن پاس نماييد. حال اگر شما مجبور باشيد در مواقعي خاص به اين فانكشن بجاي استرينگ ، عدد يا يك متغيير از نوع ديگري پاس كنيد ، چكار بايد كرد؟ آيا بايد دو تا فانكشن با نامهاي متفاوت و نوع عملكرد متفاوت تعريف نمود ؟ آيا راه حل ديگري وجود ندارد؟

در اينجا راه حل ديگري نيز وجود دارد كه اگر دو يا چند تابع را با يک نام ثابت ولی تعداد يا نوع متغير متفاوت در يک کلاس تعريف نماييم ميتوانيم از هر کدام برحسب نياز استفاده کنيم:

Function Use_OverLoads(ByVal strVar1 As String, ByVal strVar2 As String)As String
Return strVar1 & strVar2
End Function

Function Use_OverLoads (ByVal intVar As Integer) As Integer
Return intVar + intVar
End Function

Response.Write(Use_OverLoads (5))
Response.Write("
" & Use_OverLoads("Over", "Loads"))

10 پاسخ :

OverLoads

*************************
4.برای رایت تو لفت کردن فرمها و هر کنترلی از این تابع استفاده کنیدو برای کنترلی خاص فقط به جای اسم فرم در پایین نام کنترل رو بنویسید

Option explicit

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Const WS_EX_LAYOUTRTL = &H400000
Private Const GWL_EXSTYLE = -20

Private sub form_Load()
SetWindowLong form1.hWnd, GWL_EXSTYLE, GetWindowLong(form1.hWnd, GWL_EXSTYLE) Or WS_EX_LAYOUTRTL
End sub

نکته !!!؟
1.برای بسته نشدن یک فرم میتوانید در رویداد UnLoad فرمتون عبارت Cancel = True رو تایپ کنید

2.برای دیدن عبارات فارسی در محیط کد میتوانید در قسمت تنظیمات برنامه در تب Editor Format فونت رو به Courier New (Arabic) تغییر بدهید

*************************
برای من و شما بعنوان برنامه‌نویس، صحت ورود اطلاعات از سمت کاربر در بیشتر حالات از اهمیت ویژه‌ای برخوردار هست. یه نمونه ساده ورود آدرس پست‌الکترونیکی هست که باید بررسی‌های ویژه‌ای در اون گنجانده بشه. بعنوان مثال آدرسهای زیر همه صحیح هستند:

power@yahoo.com
power@ia.un.ir
power.station@yahoo.com

واقعا اگر قرار باشه حالات مختلف رو بررسی کنیم، راهش این نیست که به ازای هر حالت یه دستور شرطی رو بنویسیم. در این موارد میتونیم از عبارات باقاعده (Regular Expression) برای صحت یک ورودی استفاده کنیم.
ابزاری که در اینجا معرفی میکنم با عنوان MTrace‌ از شرکت RegExLab هست که یه محیط ساده و خیلی کارآمد رو در اختیار ما قرار میده تا عبارت با قاعده خودمون رو در اون تعریف کنیم و سپس تست کنیم که چه رشته‌هایی در این عبارت قابل پذیرش خواهد بود.
و جالب تر اینکه سورس همین عبارت رو با زبان‌های چون جاوا، وی‌بی، سی++ و سی‌شارپ ارائه میده که فقط باید کپی کنید و در برنامه خودتون قرار بدید.
برای نمونه یک عبارت باقاعده که صحت آدرس ایمیل رو نشون میده به این قرار هست:

^[a-zA-Z][w.-]*[a-zA-Z0-9]@[a-zA-Z0-9][w.-]*[a-zA-Z0-9].[a-zA-Z][a-zA-Z.]*[a-zA-Z]$

در این ابزار بعد از ورود عبارت، کلیه اجزای آنرا با رنگ‌های مختلف و بخش‌های قابل تفکیک در ساختاری درختی به نمایش میذاره. برای درک درستی از عملکرد این ابزار به تصویر زیر نگاه کنید.

سورس زیر نمونه کد تولید شده به زبان C# هست.

using System.Text.RegularExpressions;

// regular expression object
Regex re = new Regex(@"^[a-zA-Z][w.-]*[a-zA-Z0-9]@[a-zA-Z0-9][w.-]*[a-zA-Z0-9].[a-zA-Z][a-zA-Z.]*[a-zA-Z]$");

// Match object
Match m = re.Match("your string");

// found or not
if( m.Success )
{
// found
}
else
{
// not found
}



نظرات شما عزیزان:

نام :
آدرس ایمیل:
وب سایت/بلاگ :
متن پیام:
:) :( ;) :D
;)) :X :? :P
:* =(( :O };-
:B /:) =DD :S
-) :-(( :-| :-))
نظر خصوصی

 کد را وارد نمایید:

 

 

 

عکس شما

آپلود عکس دلخواه:






موضوعات مرتبط: آموزش ، ،
برچسب‌ها: